\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm,top=2.0cm,bottom=2.34cm]{geometry}
\usepackage[spanish,activeacute]{babel}
\usepackage[T1]{fontenc}
\usepackage{algo2symb}
\usepackage{newalgo}

\parskip=1.5ex
\pagestyle{empty}

\newcommand\interfaz[5]{\noindent \\#1\ifblank{#2}\then{}\else{(#2)}\fi \ifblank{#3}\then{}\else{$\rightarrow$ #3}\fi \\ \{$#4$\} \\ \{$#5$\}}
\newcommand\estr[2]{\noindent \textbf{Estructura} \\#1 src estr\_#1 donde estr\_#1 es:\\ #2}
\newcommand\rep[2]{\noindent \textbf{Invariante de representacion} \\Rep: estr\_#1 $\rightarrow$ bool\\ Rep(e) = #2}
\newcommand\abs[3]{\noindent \textbf{Funcion de abstraccion} \\Abs:estr\_ #1 e $\rightarrow$ #1 Rep(e)\\ Abs(e) = #2 / \\ #3}
\newcommand\complejidad[2]{\noindent \comentario{Complejidad: \Ode{#1}\ifblank{ #2}\then{}\else{ #2}\fi}}

\begin{document}


\begin{center}\textbf{\Large M'odulo \nombretad{multiconj\_materiales}}\\
Se explica con la especificaci'on de \texttt{multiconjunto extendido(material)} y de \texttt{IterMateriales}
\end{center}

\noindent \textbf{usa:} lista \\
\textbf{generos:} multiconj\_materiales

\noindent \textbf{Interfaz}

\complejidad{1}{}
\interfaz{Vacio}{}{res\!: multiconj\_materiales}{true}{res \igobs \emptyset}

\complejidad{1}{}
\interfaz{EsVacio}{\param{in}{ms}{multiconj\_materiales}}{res\!: bool}{true}{res\igobs\emptyset?(ms)}

\complejidad{n}{donde n es la cantidad de materiales distintos del multiconjunto}
\interfaz{Agregar}{\param{in}{m}{material},\param{in}{c}{cantidad},\param{inout}{ms}{multiconj\_materiales}}{}{ms \igobs {ms}_{0}}{ms \igobs {ms}_{0} \cup Rep(m,c)}

\complejidad{n}{donde n es la cantidad de materiales distintos del multiconjunto}
\interfaz{Cardinal}{\param{in}{m}{material},\param{in}{ms}{multiconj\_materiales}}{res\!: nat}{true}{res \igobs \#(m,ms)}

\complejidad{n}{donde n es la cantidad de materiales distintos del multiconjunto}
\interfaz{Sacar}{\param{in}{m}{material},\param{in}{c}{cantidad},\param{inout}{ms}{multiconj\_materiales}}{}{ms \igobs {ms}_{0}}{ms \igobs {ms}_{0} \setminus Rep(m,c)}

\complejidad{n}{donde n es la cantidad de materiales distintos del multiconjunto}
\interfaz{Esta}{\param{in}{m}{material},\param{in}{ms}{multiconj\_materiales}}{res\!: bool}{true}{res \igobs m \in ms}

\complejidad{1}{}
\interfaz{CrearIterMateriales}{\param{in}{ms}{multiconj\_materiales}}{res\!: iterMateriales}{true}{res \igobs crearIterMateriales(ms)}

\complejidad{1}{}
\interfaz{tieneProximo}{\param{in}{it\_m}{iterMateriales}}{res\!: bool}{true}{res \igobs \neg \emptyset?(VerConjSuby(it\_m))}

\complejidad{1}{}
\interfaz{avanzar}{\param{inout}{it\_m}{iterMateriales}}{res\!: material}{it\_m_0 \igobs it\_m \wedge \neg \emptyset?(VerConjSuby(it\_m))}{res \notin VerConjSuby(it\_m) \wedge VerConjSuby(it\_m_0) \igobs Agregar(VerConjSuby(it\_m),res)}

% sobre lista
\estr{multiconj\_materiales}{lista(<material: material x cantidad: nat>)}
	
\noindent iterMateriales src iterLista(\dupla{material: material}{cantidad :nat})	

\rep{multiconj\_materiales}{DistintosMateriales $\wedge$ HayAlmenosUno}

\noindent \comentario{no hay materiales repetidos}\\
DistintosMateriales = ($\forall$ i,j: nat, i $\neq$ j) Iesimo(i,e).material $\neq$ Iesimo(j,e).material

\noindent \comentario{todos los materiales en la estructura tienen cardinalidad mayor a 0}\\
HayAlmenosUno = ($\forall$ i: nat) Iesimo(i,e).cantidad > 0

\rep{iterMateriales}{true}

\abs{multiconj\_materiales}{ms}{($\forall$ m: material, \#(m,ms)>0)($\exists$ i: nat) Iesimo(i,e).material \igobs m  $\wedge$ Iesimo(i,e).cantidad \igobs \#(m,ms)}

\abs{iterMateriales}{itm}{ VerConjSuby(itm) \igobs  if tieneProximo(e) then Ag(Abs(Actual(e),Abs(Avanzar(e))) else $\emptyset$}

% sobre conjunto
%\estr{multiconj\_materiales}{conj(<material: material x cantidad: nat>)}

%\rep{multiconj\_materiales}{DistintosMateriales $\wedge$ HayMasDeUno}

%DistintosMateriales = ($\forall$ m, m': \dupla{material}{nat}, m $\neq$ m' $\wedge$ m $\in$ e $\wedge$ m' $\in$ e) m.material $\neq$ m'.material

%HayMasDeUno = ($\forall$ m, m $\in$ e) m.cantidad > 0

%\abs{multiconj\_materiales}{ms}{($\forall$ m: material) if \#(m,ms)>0 then ($\exists$ m': \dupla{material}{nat}, m' $\in$ e) m $\igobs$ m'.material y  \#(m,ms) $\igobs$ m'.cantidad else ($\neg \exists$ m': \dupla{material}{nat}, m' $\in$ e) m'.material = m fi}

\noindent \textbf{Algoritmos} \\

\begin{algorithm}{iVacio}{}{res\!: estr\_multiconj\_materiales}
 res\= iNueva \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iVacio?}{\param{in}{ms}{estr\_multiconj\_materiales}}{res\!: bool}
	res \= iEsVacia(ms) \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iAgregar}{\param{in}{m}{material},\param{in}{c}{cantidad},\param{inout}{ms}{estr\_multiconj\_materiales}}{}
	esta: bool \= false\\ 
	it: iterLista \=iCrearIt(ms)\\
	\begin{WHILE}{iTieneProximo(it) \wedge \neg esta}
		\begin{IF}{iActual(it).material = m}
			 esta \= true\\
			 iActual(it).cantidad \= iActual(it).cantidad + c
		\end{IF}\\
		iAvanzar(it)		
	\end{WHILE}\\	
	\begin{IF}{\neg esta}
		\begin{IF}{c>0}
			iAgregarAtras(<m \times c>\,,\,ms)
		\end{IF}
	\end{IF}
\end{algorithm}

\noindent \textit{\small{Las lineas 4 a 7 cuestan O(1), pero las ejecuto n veces, donde n es la longitud de la lista ms. Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iCardinal}{\param{in}{m}{material},\param{in}{ms}{estr\_multiconj\_materiales}}{res\!: nat}
	res:\;nat \= 0\\
	it: iterLista \= iCrearIt(ms)\\
	\begin{WHILE}{iTieneProximo(it) \wedge res=0}
		\begin{IF}{iActual(it).material\;=\;m}
			res \= iActual(it).cantidad
		\end{IF}\\
		iAvanzar(it)
	\end{WHILE}
\end{algorithm}

\noindent \textit{\small{Las lineas 4 a 6 cuestan O(1), pero las ejecuto n veces, donde n es la longitud de la lista ms. Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iSacar}{\param{in}{m}{material},\param{in}{c}{cantidad},\param{inout}{ms}{estr\_multiconj\_materiales}}{}
	it:\;iterLista  \=iCrearIt(ms)\\
	\begin{WHILE}{iTieneProximo(it)}
		\begin{IF}{iActual(it).material = m}
			\begin{IF}{c >= iActual(it).cantidad}
				iEliminar(it)
			\ELSE
				iActual(it).cantidad \= iActual(it).cantidad - c
			\end{IF}
		\end{IF}\\
	iAvanzar(it)
	\end{WHILE}
\end{algorithm}

\noindent \textit{\small{Las lineas 3 a 6 cuestan O(1), pero las ejecuto n veces, donde n es la longitud de la lista ms. Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iEsta}{\param{in}{m}{material},\param{in}{ms}{estr\_multiconj\_materiales}}{res: bool}
	res:\;bool \= false\\
	it:\;iterLista \= iCrearIt(ms)\\
	\begin{WHILE}{iTieneProximo(it) \wedge \neg res}
		\begin{IF}{iActual(it).material = m}
			res \= true
		\end{IF}\\
		iAvanzar(it)
	\end{WHILE}
\end{algorithm}

\noindent \textit{\small{Las lineas 4 a 6 cuestan O(1), pero las ejecuto n veces, donde n es la longitud de la lista ms. Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iCrearIterMateriales}{\param{in}{ms}{estr\_multiconj\_materiales}}{res\!: iterMateriales}
	res \= iCrearIt(ms) \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iTieneProximo}{\param{in}{it\_m}{iterMateriales}}{res\!: bool}
	res \= iTieneProximo(it\_m) \comentario{\Ode{1}}
\end{algorithm}

\begin{algorithm}{iAvanzar}{\param{inout}{it\_m}{iterMateriales}}{res\!: material}
	res \= iActual(it\_m).material  \comentario{\Ode{1}}\\
	iAvanzar(it\_m) \comentario{\Ode{1}}
\end{algorithm}


\end{document}
